{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 动态折线图"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "### 1. 初始设置\n",
    "\n",
    "首先，导入所需的库，并设置中文字体等。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入所需的库\n",
    "import os\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.ticker as ticker \n",
    "import matplotlib.animation as animation\n",
    "import datetime\n",
    "from IPython.display import HTML\n",
    "\n",
    "# 正常显示中文标签\n",
    "mpl.rcParams['font.sans-serif'] = ['SimHei']\n",
    "\n",
    "# 自动适应布局\n",
    "mpl.rcParams.update({'figure.autolayout': True})\n",
    "\n",
    "# 正常显示负号\n",
    "mpl.rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "# 让网格线显示在下方\n",
    "mpl.rc('axes', axisbelow=True)\n",
    "\n",
    "# 禁用科学计数法\n",
    "pd.set_option('display.float_format', lambda x: '%.2f' % x) \n",
    "\n",
    "# 定义颜色，主色：蓝色，辅助色：灰色，互补色：橙色\n",
    "c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',\n",
    "     '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',\n",
    "     '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}\n",
    "\n",
    "# 防止动态图显示不完整\n",
    "plt.rcParams['animation.embed_limit'] = 1e100"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 定义数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# # 当需要更新数据时，去掉注释后运行一次\n",
    "# import akshare as ak\n",
    "\n",
    "# # 从 akshare 获取历史数据，速度比较慢\n",
    "# df_all_history = ak.covid_19_history()\n",
    "\n",
    "# # 保存到 Excel 文件中，以便下次快速读取数据\n",
    "# df_all_history.to_excel('./data/covid_19_history_20200711.xlsx')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义想要展示的国家\n",
    "countries = ['中国', '美国']\n",
    "\n",
    "# 从 Excel 文件中读取数据\n",
    "df_all = pd.read_excel('./data/covid_19_history_20200711.xlsx', index_col=0).fillna('')\n",
    "\n",
    "# 将字符串格式的日期转换为日期格式\n",
    "df_all['date'] = pd.to_datetime(df_all['date'])\n",
    "\n",
    "# 将时间格式转为字符串格式的日期，以 YYYY-mm-dd 的形式保存到另外一列\n",
    "df_all['dates'] = df_all['date'].apply(lambda x:x.strftime('%Y-%m-%d'))\n",
    "\n",
    "# 添加现存确诊列\n",
    "df_all['current'] = df_all['confirmed'] - df_all['cured'] - df_all['dead']\n",
    "\n",
    "# 排除省份的数据，只保留国家的数据，设置日期为索引\n",
    "dfc = df_all.query(\"province==''\").set_index('date')\n",
    "\n",
    "# 对应每个国家的序号\n",
    "n_list = [i for i in range(len(countries))]\n",
    "\n",
    "# 以字典的方式存放每个国家的数据\n",
    "dic = {}\n",
    "for country_i in countries:\n",
    "    dfi = dfc.query(\"country==@country_i\")\n",
    "    dfi = dfi.sort_index(ascending=True)\n",
    "    dic[country_i] = dfi\n",
    "\n",
    "# 计算最大的确诊人数\n",
    "y_max = 0\n",
    "for country_i in countries:\n",
    "    y_max_i = dic[country_i]['confirmed'].max()\n",
    "    y_max = max(y_max, y_max_i)\n",
    "\n",
    "# 合并两个国家的确诊人数\n",
    "df1 = pd.concat([dic[countries[0]].confirmed, dic[countries[1]].confirmed], axis=1)\n",
    "df1.columns = [countries[0], countries[1]]\n",
    "df1 = df1.fillna(0)\n",
    "\n",
    "# 总天数\n",
    "length = df1.shape[0] + 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 开始画图\n",
    "\n",
    "用「**面向对象**」的方法画图。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAApIAAAI4CAYAAADZDwnuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAgAElEQVR4nOzdd3wUdf7H8fe2bDYdQlNUEAt4goAFEbFg5SyooHeePzwOVBSVYkEU7mwoFrzD3hXFgh4C6okF9VSkKCAgqCgioYtISSHJZtv390dux2yy2d1MgAR8PR8PHnfOzM7MbmZn3vud7/czDmOMEQAAAFBHzobeAQAAAOyZCJIAAACwhSAJAAAAWwiSAAAAsIUgCQAAAFsIkgAAALCFIAkAAABbCJIAAACwhSAJAAAAWwiSAAAAsIUgCQAAAFsIkgAAALCFIAkAAABbCJIAAACwhSAJAAAAWwiSAAAAsIUgCQAAAFsIkgAAALCFIAkAAABbCJIAAACwhSAJAAAAWwiSAAAAsIUgCQAAAFsIkgAAALCFIAkAAABbCJIAAACwhSAJAAAAWwiSAAAAsIUgCQAAAFsIkgAAALCFIAkAAABbCJKNwLx58/TFF1/stu39+OOPCgaDu217e5KioiJt2bJFoVCooXcF1axevVpLlixRYWFhrcusX79eP/300y7dj9LSUhljduk2AGBPYTtIlpSUaOjQoerevbsikUjKr6uoqNDnn3+uu+++Wz/88IPdze82M2fO1EUXXaTzzz9/l23jrLPOUp8+fXbZ+qsKBALq1auXWrdurY8//niXbuuRRx7ROeecoyeffFKbN2/eqetetGiRbrrpJt1///31CsWlpaWaN2+e9d9nn322mjdvrvnz50uSli1bViOY3HPPPerfv7+ef/55W4Hixhtv1MMPP6xvvvkm4XIffvihwuFwndefyLx58zR48GCddNJJO3Xd99xzjz744IMan8ePP/6oRx99VC+//HK9t3HzzTera9euCY/bBx98UAcffLDOOeccW3+bpUuXKi8vT8ccc0ytyzz22GPKysrS2LFj67x+ANjbuO2+MDMzUy+//LIKCwv1zTff6IgjjqixzKeffqply5Zp48aN2rBhg1atWqWvvvpKfr9fkjR37lzNmDHDWv6mm27S+PHj7e5SXB988IHOOOMM268vKirSG2+8IbfbrVAoJLe7bh/Ze++9py1btsjn88nr9crhcNRYxuVyyeFw6J133qkxzxijiooK6zPr37+/vTfyP6+88oo2bNigjh076qSTTqrz6wOBgG6++Wb1799fRx55ZMJln3/+eS1ZskQzZsxQhw4d1KJFC7u7XcPmzZs1fvx4NW3aVDfddJOtdQSDQR1xxBHaunWrVqxYoRYtWig9PV2S5PP5JEmjRo3SBx98oEceeURXX321JGnhwoWaNm2aAoGABg0aVOftvvbaa9qwYYP69eunN954I+4y27dv1xlnnKFWrVrpgQce0P/93//Zeo/VFRUV6ZlnnpEkrV27VgceeGC91xkKhTR+/Hht375dZ599dsxxvHz5cg0dOlTHHntsvY9dr9crqfLcE084HNbrr78uSbryyivjfteSSU9PV1FRUa3bkKSsrCyVlZWpefPmdV4/AOxtUk5FJSUlCgaD8vl8Sk9Pl9Pp1EknnaS33npLCxcuVMeOHRUKhVReXi5Jys3N1b333qsPPvjAWkdmZqb2339/7bPPPmrRooWaNm2qdevWaf/997fmS5UtdJ06darXG5sxY4a++eYbZWVl1Ws9hxxyiKTKi2VBQYH131HGGOt9p6WlWUEk6p///GfKLX/nnntuwvn5+flxL8avvvqqNm/erPT09JigGw6HFQgE1KFDB51++ukyxlhBvUuXLnrhhRdi1uNyuTRgwAA5nbU3VI8bN04TJkzQ66+/rgULFmjfffeNu9z333+vJUuWWP+9ZMkSnXzyyQnfX13k5uZKkvbZZx/b6/B4PLrjjjt06aWXavTo0Xr22WeVlpYmqTK0fPvtt/rggw902GGH6fLLL7deF21Jv/HGG+u8TWOM1Tr717/+tdblPv30U0nStm3b1KNHj5TWXVRUJKfTKa/XK5fLJafTWSNM9ezZ0/pR9OOPP9YIksYYRSIRhcNhVVRUKBgMqmnTpgm3O3v2bG3fvl1SZfCuKhrI8/PzU3oPiUT/Nh6PJ+78qVOnav369crNzVVpaalee+21mPlut1v9+vWL+UyMMdq+fbsyMjLk8Xis74/P51MgEJDf75fT6Yw5j0SXiUQiWrt2rQKBgPXv8MMPr3X/AGCvZFJ0ww03GEkp/RswYIAxxpjzzjvPSDLTpk0zhYWFSbdx3333GUlm4sSJqe5WrQYMGGAkmblz59a6TFFRUcrvKZV/TzzxRI1tbN682fzyyy+muLjYBAIBEwwGa/xr06aNOeigg+LOCwQCpri42GzevNls2LAh7vs46aSTEu7XNddcY4wx5qWXXkq43OWXX570c/X7/aZ79+5Gkjn22GON3++Pu9zgwYONJDNs2DCzzz77mP3339+UlpYmXX+q5s+fbySZY445pl7rCYfD5pRTTjGPP/64McaYs88+20gy33//vZkwYYLxer1m5syZ1vJbt241TqfTNG/e3EQikTpvb/PmzUaScblcpqioqNblrrzySiPJ/O1vf0t53ccff/xOPZ4lmdatWyfd7t/+9jcjyRx//PE15n3yySdGkrngggtSfh9RH374oRkyZIi5/vrrzciRI03Xrl2NJPPnP//ZDBs2zAwePNgsW7bMGGNMJBIxRx55ZML3MmTIkBrb2L59e9LPYPjw4WbmzJkpfV7l5eV1fp8AsCdLuUWyZcuW6tKli3w+n3w+X42WDmOMgsGgysvLtd9++0n6rQXhwAMPtFqQEqmoqEh1d1K2Y8eOWudFW0BdLpd69uxpa/1V33e8lpvmzZtr6dKlWrlypdWaW/2z8/v9crlcmj17do11+/1++f1+ZWZm1nqLPnrr3ePxqG/fvpo5c6YKCgrUrFkzBQIBOZ1OrV27VsOHD1daWpq++OILHXbYYZIqW1WOOOIIbdy4UXfccUfS9+v1evXGG2/oqKOO0pdffqmHH35YI0eOjFnmhx9+0MSJE9WsWTPdeeed6tKliwYNGqShQ4fqueeeS7qNukjUeppMUVGRPB6PPvjgA7lcLkmy/tfpdGrEiBEaMGCAfD6ftm/friZNmujjjz9WJBJRdna2/vGPf8SsL/r36t69uy666CJreiQS0aJFiyRJBQUFkqS2bdtqxYoVMa/v3LmzPB6PIpGI3nrrLUmq063zAw88UKWlpUpPT7daJKOfz3fffadff/1VnTp1so7Tn376SevXr1f79u3VqlUra1+rtkg2adIk4TaLi4v173//W5J01VVX1bpcvL/TokWLNHfuXA0ZMsT63Kv67rvv9OKLLyojI0Nut1slJSWSfus7Wl5err59+6pjx456+eWXtWjRInXt2lUzZ8601rFlyxYdddRR8ng8uvPOO2tsw+VyqVOnTsrOzpbH41EwGNTcuXOVn5+vDh06qKysTK1atdKhhx6q888/X82aNdPq1av10Ucf6eKLL1anTp2Unp6ue++9V8aYGnckAGCvV9fk+e2335pXX301ZtqmTZvMkCFDzNtvv23C4bA1/eKLLzaSzOLFi1Na94IFC8zEiRPNjz/+WNfdMsYYs3DhQnPSSSeZ0aNHm9LSUrN9+3YTDAZjlvH7/WbBggXWNtLT001WVpat7aVqzJgx9W4ZOuqoo5JuJxKJmPz8fNOhQ4eY6UVFRaZz585GknnwwQdj5k2ePNlIMjfeeGOd3tNHH31khgwZYgKBQMz0YDBoevbsaSSZZ555xpr+xz/+0Wr1LCsrq9O24pk7d66RZLp162Z7HQcddFCd/gbBYNBcccUVKbVgVVVRUZHS+n/99VdjTOVnm2zZPn361Om9/vnPfzaSzHvvvWdNi95lqM8dgIceeshIMs2aNYvbOh1tkezXr1+Neb169TKSzCGHHGLWrVuXdFvXXHONkWQ++eSTmOlbt241rVu3Ng6Hw8yePTtm3rXXXmskmfHjx6f0fgoKCowkc/bZZ9e6zLhx44wkM2fOHGta8+bNTZcuXVLaBgDsTeo82OaSSy5RQUGBzjnnHGVnZ0uSPv74Yz3xxBMqLi6O6edX19aio48+WkcffbRmzJihu+66S3l5eTG/8EtLS1VUVKRBgwbF7W/n9/v12WefaZ999lFGRoYyMjJqLLNw4UL17NlTI0eO1P3336+srKxd0hJa1fDhwzVw4MBaW3OPOOIIud1uq9UqKhKJWC2SqXyWixYt0tatW/WnP/0pZvqAAQP09ddfq2/fvho+fLg1PRAIaMyYMfJ4PLrhhhvq9J5OPfVUnXrqqTWm33DDDZo9e7aOO+44XXbZZdb0SZMm6ZhjjtGzzz6r999/X3fffbf69+9vu0Xx559/lqQ6VQyorn379mrWrJm8Xq/C4bDmzJljzTvuuOOUnp6ucDisYDCo0tJShUIhTZ8+XQ6HQzNnzlSzZs0kSb/88ot69+6tnj17avz48TVa8dLS0uR0OuXz+eKO/n/nnXdUVFRkHa+PP/64JKl169Y1+vju2LFDGzZssLZdm7Fjx+r0009X9+7dU/48zP/60F5yySXWXYVE/H6/7rvvPknS4Ycfbg2GScWUKVP0ySefSKpsdU1le7UZNGiQNmzYoEGDBun444+3pv/000966qmndMABB2jo0KF1Wuevv/6qBx54QJ988on69u2ryy67TJMmTVKPHj20YcMGSZV/H6nyGNy2bZuOPfZY2+8BAPZUdQ6Sw4cP16BBgzRx4kQNGzZMkvSf//xHDodDt956a8yydkZNSpUlQ1588cVa559yyilxp0c7uUdvqccTHcSzfPlySVJGRoYVJE844QStWrVKXq9Xbrc7pZBTVlamkpISlZSUxNQe3LJlixYsWKD09HSlp6fL4/FYAxKqC4VCMsZo5cqVtW4nFApp9erV8vv9OvTQQ9WuXbsay0ydOlVSzUE7kydP1oQJE/TWW2/V+jepPmjl9ddfrxFIEzHGaNSoUXr44YeVk5OjF198UQ6HQ2VlZZoxY4YuuugizZw5U7169dL69es1YMAA3Xrrrbriiit09dVXJ72FWt3GjRslqV71HqtWDBgxYoTmzJmjvLw8FRYW6oUXXlA4HNZTTz2lBx98UFLlcb5lyxadcMIJOu2006zXRm9Rt2nTptbg5na71axZs7hlcDp27KiioiKlpaXpp59+0ltvvaWsrCwtXbq0RneJ119/XRdffHHCIDlv3jzddtttuu222/Tcc89p4MCBKX0ew4cP1yOPPKKnnnpKn3zyiQ444ICEy991113W36Eutm7dqmuvvVZS5Y+cm2++uc7riCorK9P++++vnJwcnXfeeVq8eLE1wOe2225TMBhU//79rS4F2dnZVgCUpMLCQs2ZM0dLly7VokWLtGDBAknS/PnzNX/+fLVr105t2rTRTz/9pGuvvVYVFRXKzc2Vx+Oxwq/f71c4HN4pA4oAYE+TUpAMhULatm2bfD6fzjvvPP3tb3/TcccdJ6myX+OMGTN0/PHHq02bNioqKpLf71fLli2tOm5XXXVVjZaVcDisHTt2aODAgVZZlagrr7xSAwcOtEZSRgUCAZWVlSk9PV2bNm1SOBxWWlqa1R+stLRUUmVZl8LCQgWDQQUCgZgLR05Ojvbbbz/9+OOPkirDbjRcFRcXa/v27VYfs6r9tn755Rc5HI4aJWyiozWrW7Jkic4666xUPl5Lotp1VU2YMEEjRoyosR8vvviisrOza7QUpqen65ZbbtHcuXPldDr10EMPSZK+/PJLvfzyyxo2bJg1Gj06rXr5k2HDhmn9+vVWfzVJatasmR544AFt27ZNAwcO1Ntvvy23263XX3/dWt+QIUM0adIk3XnnnfrHP/6hL7/8UhdeeKG++OILrVmzRi+++KKuu+66On1OUuWocKkylNRHJBLRyJEj9dBDD6lv374qKyvT+++/r1AopMsvv1zz5s3TH/7wBw0ePFgvvfSSJNVoPYv23UtUDiZeH8B4y4wdO1bhcFjXXHNN3D630WLctQXJUCikIUOGyBijE044oU5lg6688kq99tprWrVqlU4++WTNmjWr1pbChQsX2irVFYlE9Ne//lWbN2/WkUceqSeffDLucoFAQKWlpfL5fPJ4PDGfn6nSd7iiosL629X2A3PcuHEaN26cJOniiy/W5MmTrXnBYFB/+tOfVFZWJrfbrU6dOmnNmjU6+uijNXXq1Jgw/cMPP+iyyy7Te++9J4fDoeHDh+vee+9VZmamHA5HvVrHAWBPlVKQ/P7772uU46leOmb27Nkxt6GDwaAVJL/88sta13322WfXmBa9BVxdWlqa1dp41VVXWQMSqps8ebJ1sWjTpo1Wr14dM3///ffX4sWLrf2Ltjx+/fXXcdcXDAaVlpampk2batOmTbW+l6q6deumr7/+WpmZmXK73SkFiUSCwaB18YxXcue5557Txo0b5XK5asxfs2aNtR8Oh8NqDcrKytLLL7+sCy64wOoqEJ1W/Tbl3Llz9dVXX8VMO/jgg3X99derW7du2rBhg1wul1555RX17t1bknTvvfdq0qRJcrvd6tChg6TK24GzZ8/Wv/71L9199916+umn43ZBSOazzz6TJK1bt04//fSTDjrooDqvY9myZbrqqqs0d+5c9ejRQy+99JJ1PFZUVGjixInq1KmTRo0apS5dumj69OmSFFPWSPqtdTRRKaJUWrc3bdqk119/XTk5ObXWxowGydpacK+88kp9/fXX2nfffTVlyhTr+xI91k2VIt3Vpx1++OH6+OOPdcopp6igoECnnXaaZs2aVePHU7T7RCAQ0DnnnBO3/mltbr31Vr377rtq2bKlpk+fXuvglFmzZun000+PO696YPz555/VuXNn6wdQvFqvy5Yt0+jRo2tsr3nz5rrtttu0zz77qE+fPtq+fbsOPPBAtWzZskaLbFZWllavXi2Xy6UuXbroscce044dO/TCCy8oOztba9eulVQ5oCo3Nzdp2SQA2BukFCTT09PVpUsXpaenWy2ADodDX331lYqKinTiiSfK5XJZIz3Ly8vlcDisJ2csXrzYChKXXHKJpk+frsWLF+uAAw6wTvrRFspoi1e8W7DGGAUCAYXDYY0aNUpXXHGF1f/M6XRqxYoVuuqqq3TmmWdq1KhRtT7xpEOHDsrJybFqXia7yEeLgSe6ZV5dTk5OTJH2iooK6/aaHYccckitYXTTpk0aPXq0pMp+fyeccIKkytGtq1atqtN+R1Xf1kcffSSXyyWfz6fZs2erV69e8nq92nffffXee+/p8ssv1y233GL1Abzjjjt0++23y+Px6LXXXlPfvn1VXFyspUuXWn1UhwwZYqvO55YtW/Ttt98qMzNTpaWlevrpp62+eqkqLS3VoEGDtHDhQl144YWaNGmSfD6f2rVrp5KSEjmdTrVv314DBgzQrFmzNGLECIVCIbVo0ULLly/X2rVrraAR7TNXW03NVO2zzz5aunSpFi9erLy8PC1evFhdu3aNWSYaJPPy8mq8/vbbb9fzzz8vj8ejKVOmqGXLlta86Hex6tNsot0CqnYP6NSpk2bMmKFevXrphx9+0KWXXhpTC7asrExnnXWWCgoK1KFDB916660pB8l77rlHd999tzIzMzVjxoyEt87btWunsWPHyuv1yuPxyOl0yu/3a9SoUWrfvr2GDBmiYDCosrIyZWVlKSsrK2Hra/Q4i/ddqBrat2zZEvf1P//8s8477zwtX75cDz/8sIYMGaInnnhCV1xxhaTKfs7z5s3T2rVr9fnnn+uGG27QfffdZ6tgPQDsUeozUidat2779u1x559//vlGklm7dq01rV+/fkaSWb58ecyyy5YtS3n07JVXXhl3ewsWLDDSb3UsU9GmTRvTokWLhMv8+uuv1uhSuz7++ON6jdqurT5dJBKx6nVW/2z69etnnE6n9d/nnnuucTqd5pFHHjGPPPKI6d+/v5Eqaz1Wn1Z9ZGxV0ZG48UaSb9myxfTp08dIMmlpaebNN9+05g0dOtR4vV4zZcoUG5/gb1588UUjyQwePNh06dLFZGdnm61bt9Z5PevWrTMvv/yy9d+9e/c2Q4cONT/88IM1bdu2bSYQCJg333zT9O7d2zzyyCM1Rr8PHTrUSDKffvpprdvKzMw0DofD5Obm1vjndDpN1a9ieXm56datm8nLy6tRazJaX/LDDz+ssY2///3vxu12m4ceeqjGvOio+X//+9/WtMsvv9xIirv89OnTzQknnFCjdmkoFDIDBgwwPp/PLFmyxPrennTSSXHfd/RYyc3NNZKMx+Mx//nPf2r9nBKJ1nw89dRT6/za6H5cffXVceevXbvWfPHFF+buu+82ksw555xjjDFmx44d5l//+pdp0qRJwuoGjz32mJFkunfvbk499VQjyUyePLnO+wkAe5pdGiR79+5dY35tQXL9+vXmmmuuMSNHjjSjR482HTt2NJLMiBEjzJgxY4zL5TJNmjQxI0eOtC7+N954o2nXrp356aefjDGpB8lt27aZ6dOnm8GDBxuv1xtTdNnlctkKeslK2kyaNMlIMvfdd1/M9I0bN5ojjjjCPP744zGlk6IOOOAA06RJk1rXO3LkSCPJ7L///nGDpNfrtf47GiZS+ZdKkDz22GNjpj/55JOmWbNmRpJp1apVTCmWN954wzgcDiPVrch2PKeccoqRZD744AMzYcIEI8mMGjWqTuvYunWrKSwsNBUVFSYUCpmVK1caSWa//fZLWjy/ZcuWMe89Wu5o48aNtb4mMzMz6Wde1YUXXmgkmXHjxsVMj5bxWbBgQdztrFixIu70Dz/80Lz00ktm1apV1rTZs2ebl156yXzzzTcJ3291kUjEfPXVV8YYkzRIvvfee9b7y8rKiinunoqlS5eakpISY0zyILlgwQKzbNky8/3335uVK1eaVatWmYKCAlNQUGCVuYoW569uyZIlMX+L0aNHG2Mqy1k999xzJj8/3zz99NO17mcgEDDHHXdczHuN7jcA7M1SHrV92WWX6f33348Z0RztE9StWzc5HA6FQiFVVFTooIMO0meffaaioiJJSun2ZevWrfXoo49a/71ixQp98803GjNmjDWoo2nTprr//vutZQoKCrRq1SotXrw47ijmeHr16qXPPvsspq9Y1f6AGRkZKisr08EHH2xNKykp0caNG5WZmVlj8MGKFSuUkZERt09nVdF+mh07doyZfs0112jp0qW6+uqrNW3aNM2cOTPmtv727dutR0jG07RpU7lcLj388MO64IILEu5DRUWFXC6XdSvzhRde0MCBA/XJJ59YfSSj0+xwu93asmWLjj32WE2bNs261fvhhx+qf//+MsaoX79+evbZZ22tX5K++uor/fe//1Xbtm112mmnqVu3brr11lv14IMP6qqrrlLbtm1TWs9ZZ50Vt+/u+vXra9w2HjFihCZMmGD995lnnqlJkyZp+fLlOvjgg7VkyRLl5+cnfVxjvP66UuUx8e2338ZMGz16tN544w099thjGjlypNUFJNGtbamyC8Tbb7+t5557zuomUrWbwkcffVTjNdWn9e7dWxdffHGt78PhcCR9zrokzZw503oMZPPmzfX++++n9LqqrrzySs2bN08ffvihjj76aEmVpXmmTp2qsrIyHX744dY6u3fvHnPrvi46d+6sbt26KS8vT71799Y111wjqfKYHjRokBYvXqyioqKYR7pWFS1sP3z4cL377rsaP358vR/PCgB7gpSDpN/vV0lJiQKBgBUkoyft6NNjokEyOnp6/fr1tXZ+TyY6GjfRybhLly6aOnWqvv76a/Xr1y+l9Xbu3Flff/21Bg4cqPPPP18nnnhizFN3PB6P8vLyrFHBUuWgkVtuuUWHHXaYZs+eHRM8o/2zqissLJTP57OWjY4Srx4kX3/9dY0fP1733HOPRo8eHRMiQ6GQSkpKYgJKdOR6bm6uHA6Hbr75Zp166qkpPZs82id0V7nsssvUrFkz9e7d23rfkydP1sCBA1VRUaHTTjtNr7zyilwul+bNm6dIJBJT9y8Vt9xyiyTp6quvltPpVF5engYPHqx//vOfuu6666wBMckcf/zxat26tTX4YvLkyfJ6vfrzn/9sLTNv3jytWLGixuj7P/3pT5o0aZIef/xxnXvuudqxY4fOPPPMOr2PZLp27apu3bpp/vz5evfdd9WnTx9JyYOkJK1du1Zvv/22re3m5ORYI5ztWrlypW6//Xa98sor1rQTTzyxziFSqny/DodDxx13nNXneenSpbrwwgslVdbLjK534sSJSktLs8JztO+zw+HQN998Y/Ujri4cDquwsFAff/xxzIC+qqZMmaJffvnF2m482dnZev755+v8HgFgT5ZywoteFGbPnq2OHTsqLy9PPXv21Jw5c/Tdd98pNzdXZWVlVtmYiooK/fzzz9aj+Opq5cqVys/PT/jIsR49emj48OHWKOFU3HzzzRo7dqyys7OtsFg1qLlcrhplPKKPXFu4cKF69+6tt956Szk5Odb8eIWYu3TpojVr1tSY3qZNm1r3rbbyJR9//HGNwUclJSVWgD3mmGOsAUGJFBUVyRhj1TKcN2+epMoWw/Xr18dMq4tt27ZZI1TPO+88SZWDWUaNGqXHHntMUmUr17Rp0+T1erVixQqde+65crlceuedd1Iu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mXbt2hlJZsKECTXW9Z///Mdqmam+jz6fzwqStSksLDQtW7a0PoMLL7ww4fJ1sX79enP99debQYMGmfT0dKtFJpkNGzbUCJLGVIayaNB5/vnnY+ZVDZJbt241s2fPtsLKnDlz4m5n9erVVhh57bXXYuZNmTLF3HDDDeawww6zPhun02kuuuiimO4Dyd7HfvvtZ71+3333NV9++WVKr61qyZIlVv9WScbtdse0pq9atco8+uij5owzzrBaBDt16lSj1TMQCJiJEydarZOSzCWXXGJKS0utZebNm2fdtpdkbrnllph1+P1+I6nWINmzZ0+Tn59vNm/eXGPeOeecExP8vF5vrX+b5cuXm4ULF5pZs2aZKVOmmIceeshcffXV5vjjj4+5td68eXNzyimnGI/HExPWu3fvbgYPHmxuv/1288ADD5gJEybUOGaq+/TTT40kc8wxx8Sd/91336XU0n7VVVfFvC7aMvzoo4/WWOfPP/9srrvuOuu4jv7LyMgwrVq1MgcffLA55JBDTLt27cx+++1n8vLyYh40ULWLSTAYNI8++qi55JJLTKtWrWI+o/vvvz9uwP7qq69Mhw4dTMeOHc2+++5rvWb69OkJPysA2BvZerLNuHHjTG5urjnhhBNq9EOcNm2aOfTQQ2t90shJJ50U9zbWggULTLNmzcxZZ50V91b04sWLTbdu3YzX603pwpSVlWX69u0btwWzsLDQjBkzxgwdOrTGPIfDkTRIGmPMmDFjTEZGhunfv7+tQQq1iUQiVlBzuVzm9ttvT+l1FRUVZt68eTFPLjGmsmX2pJNOMhdddFGN13z77bdmwoQJZt26debXX381OTk5RqoclJEovG7ZsiXuLePBgwdbn392dra55pprUh70UtWaNWtMbm6uOeecc+L+GElVSUmJueaaa4zL5Yp5FKIxlY+sjIaL7t27m6lTp8Zt7Q2Hw2b06NFGquxfOG3atLjb+u6778xhhx1mevXqFRMyjan8mxYUFJh169bV+T089thjpkWLFqZHjx5m5MiRCZ9CM2zYsFq/D+3atTOXX365mTFjhtU9YsuWLeb55583F154YUwQrvrvmWeeSbh/0b63ifpt3nfffeaoo44y7du3r/Gva9eu5tprr63xNKHZs2eb5s2b1+g3WVU4HDazZs0y48aNM3/5y19M165dTevWrZOeI6JP5Yl6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\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用「面向对象」的方法画图，定义图片的大小\n",
    "fig, ax = plt.subplots(figsize=(10, 8))\n",
    "\n",
    "# 设置背景颜色\n",
    "fig.set_facecolor('w')\n",
    "ax.set_facecolor('w')\n",
    "\n",
    "# 隐藏边框\n",
    "ax.spines['top'].set_visible(False)\n",
    "ax.spines['bottom'].set_visible(False)\n",
    "ax.spines['left'].set_visible(False)\n",
    "ax.spines['right'].set_visible(False)\n",
    "\n",
    "# 隐藏刻度线\n",
    "ax.tick_params(axis='x', which='major', length=0)\n",
    "ax.tick_params(axis='y', which='major', length=0)\n",
    "\n",
    "# 设置坐标标签字体大小和颜色\n",
    "ax.tick_params(labelsize=16, colors=c['深灰色'])\n",
    "\n",
    "# 定义动画函数\n",
    "def animate(num): \n",
    "    # 先清空画面\n",
    "    ax.clear()\n",
    "    \n",
    "    # 动态显示新的数据\n",
    "    df_temp = df1.iloc[0:num, :]\n",
    "    idx = df_temp.index\n",
    "\n",
    "    # 绘制第一个国家的折线图\n",
    "    ax.plot(idx, df_temp[countries[0]], color=c['蓝色'], linewidth=3, zorder=2)\n",
    "    string = '★'+countries[0]+str(df_temp[countries[0]][-1])\n",
    "    ax.text(idx[-1], df_temp[countries[0]][-1], string, size=20, ha='left', va='center', color=c['蓝色'])\n",
    "    \n",
    "    # 绘制第二个国家的折线图\n",
    "    ax.plot(idx, df_temp[countries[1]], color=c['橙色'], linewidth=3, zorder=2)\n",
    "    string = '●'+countries[1]+str(int(df_temp[countries[1]][-1]))\n",
    "    ax.text(idx[-1], df_temp[countries[1]][-1], string, size=20, ha='left', va='bottom', color=c['橙色'])\n",
    "\n",
    "    # 设置标题\n",
    "    ax.set_title('\\n新冠病毒确诊人数的变化趋势\\n', loc='left', fontsize=26)\n",
    "    \n",
    "    # 图片背景显示日期的动态变化\n",
    "    ymean = (ax.get_ylim()[0] + ax.get_ylim()[1]) / 2\n",
    "    string = (df1.index[0]+datetime.timedelta(days=int(num-1))).strftime('%Y年%m月%d日')\n",
    "    ax.text(df1.index[0], ymean, string, ha='left', va='center', fontsize=90, color=c['灰色'], zorder=-1, alpha=0.2)\n",
    "    \n",
    "    # 设置 X 轴坐标范围\n",
    "    ax.set_xlim(df1.index[0]+datetime.timedelta(days=-5), df1.index[-1]+datetime.timedelta(days=5))\n",
    "    # ax.set_xticks(ticks=[df1.index[0]] + [df1.index[int(length/2)]] + [df1.index[-1]])\n",
    "    ax.set_xticklabels([])\n",
    "    \n",
    "    # 设置 Y 轴坐标范围\n",
    "    ax.set_ylim(0, df1.iloc[0:num,:].values.max()*1.2)\n",
    "    ax.set_yticklabels([])\n",
    "    \n",
    "# 绘制动画\n",
    "animator = animation.FuncAnimation(fig, animate, frames=np.arange(1, length, 1), interval=100)\n",
    "\n",
    "# 在 Jupyter Notebook 中显示动画\n",
    "# HTML(animator.to_jshtml())\n",
    "\n",
    "# 保存为 mp4 的文件格式\n",
    "animator.save('动态折线图.mp4')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
